home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2000 Spring / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin / F2JW / trans / pattern.cpp < prev    next >
C/C++ Source or Header  |  1999-08-22  |  15KB  |  843 lines

  1. //
  2. // フランス語 → 日本語 翻訳プログラム
  3. //
  4. // パターンマッチング部
  5.  
  6. #include "stdafx.h"
  7. #include    <string.h>
  8. #include    <ctype.h>
  9.  
  10. #include    "f2j.h"
  11. #include    "myprot.h"
  12.  
  13. extern    TOKEN        *currentTree;
  14. extern    ADVERB        dic_adverb_NE;
  15. extern    ADVERB        dic_adverb_Y;
  16. extern    ARTICLE        articleTable[];
  17. extern    PRONOUN        objectNounTable[];
  18. extern    PRONOUN        nullPronoun;
  19. extern    JP_PRONOUN    dic_Ce[];
  20. extern    BOOL        isChanged;
  21. extern    JP_PREPOSITION    dic_jpPreposition_DE[];
  22. extern    PRONOUN        nullPronoun;
  23. extern    PRONOUN        dic_pronoun_en;
  24. extern    PREPOSITION    dic_preposition_en_de;
  25.  
  26. //
  27. // FR_PATTERNに合っているか?
  28. //
  29. BOOL
  30. IsPatternMatch(CMP_TOKEN *q, TOKEN *p)
  31. {
  32.  
  33.     while(q->frPart != FR_PART_NONE) {
  34.         if(p == NULL)    return(FALSE);
  35.  
  36.         if(!IsObjectMatch(p, *q))
  37.             return(FALSE);
  38.         p = p->next;
  39.         q++;
  40.     }
  41.     return(TRUE);
  42. }
  43.  
  44. BOOL
  45. IsPatternMatch(FR_PATTERN *q, TOKEN *p)
  46. {
  47.  
  48.     while(q->cmpToken.frPart != FR_PART_NONE) {
  49.         if(p == NULL)    return(FALSE);
  50.  
  51.         if(!IsObjectMatch(p, q->cmpToken))
  52.             return(FALSE);
  53.         p = p->next;
  54.         q++;
  55.     }
  56.     return(TRUE);
  57. }
  58.  
  59. //
  60. // 以下、FR_PATTERN に組込用の評価関数
  61. //
  62. // 常に <TRUE>を返す
  63. BOOL
  64. ReturnTrue(TOKEN *p) {
  65.     return(TRUE);
  66. }
  67.  
  68. // 常に <False>を返す
  69. BOOL
  70. ReturnFalse(TOKEN *p) {    return(FALSE);    }
  71.  
  72. //
  73. // 疑問代名詞(副詞)の置き換え
  74. //
  75. void
  76. ChangePattern(TOKEN *start, FR_PATTERN *q, TOKEN *p)
  77. {
  78.     int        cnt = 0, stack = 0;
  79.     int        i = 0, j = 0;
  80.     TOKEN    *tmpTokens[100], *tmp = NULL, *next;
  81.  
  82.     while(q->cmpToken.frPart != FR_PART_NONE) {
  83.         if(p == NULL) goto Error;
  84.         next = p->next;
  85.  
  86.         if(q->newFrPart) p->frPart = q->newFrPart;
  87.         p->jpProp |= q->newJpProp;
  88.  
  89.         if(q->order != 1)    DisconnectTOKEN(start, p);
  90.  
  91.         tmpTokens[q->order] = p;
  92.         // 変換後、単語数が減る場合も有るので、単純にcnt++してはいけない
  93.         if(cnt < q->order)    cnt = q->order;
  94.         q++;
  95.         p = next;
  96.     }
  97.  
  98.     tmp = tmpTokens[1]->next;
  99.     for(i = 1; i < cnt; i++) {
  100.         tmpTokens[i]->next = tmpTokens[i+1];
  101.         if(IsObjectMatch(tmpTokens[i], FR_PART_NOUN_GENERAL))
  102.             tmpTokens[i]->moved = 1;
  103.     }
  104.     tmpTokens[cnt]->next = tmp;
  105.     return;
  106. Error:
  107.     PrintInternalError( "Internal Errorr <ChangeInterrogative> 1\n");
  108. }
  109.  
  110. //
  111. // FR_PATTERNにて使用される評価関数
  112. //
  113. BOOL
  114. CanBeSubject(TOKEN *p)
  115. {
  116.     if(p
  117. //    && p->moved == 0    // ProcessInterrogativeで、順序を代えたのは、moved == 1になっている
  118.     && p->frPartChoice != FR_PART_OBJECT
  119.     && (p->frPartParent & FR_PART_VERB)
  120.     && !IsObjectMatch(p, (FR_PART)(FR_PART_NOUN_OBJECT_BOTH | FR_PART_NOUN_RECURSIVE)))
  121.         return(TRUE);
  122.  
  123.     return(FALSE);
  124. }
  125.  
  126. BOOL
  127. CanVerbOrder(TOKEN *p)
  128. {
  129.     if(p->subject == NULL
  130.     && (p->frTense & FR_TENSE_ORDER))
  131.         return(TRUE);
  132.  
  133.     return(FALSE);
  134. }
  135.  
  136. BOOL
  137. IsAttribPluralWArticle(TOKEN *p)
  138. {
  139.     if((p->frAttrib & FR_ATTRIB_PLURAL)
  140.     &&  SearchToken(FR_PART_ARTICLE_DEFINIT, p->child))    return(TRUE);
  141.     else    return(FALSE);
  142. }
  143.  
  144. BOOL
  145. IsAttribPlural(TOKEN *p)
  146. {
  147.     if(p->frAttrib & FR_ATTRIB_PLURAL)    return(TRUE);
  148.     else    return(FALSE);
  149. }
  150.  
  151. BOOL
  152. IsAttribPlural(TOKEN *s, TOKEN *v)
  153. {
  154.     if(s->frAttrib & FR_ATTRIB_PLURAL)
  155.         return(TRUE);
  156.  
  157.     return(FALSE);
  158. }
  159.  
  160. BOOL
  161. HasChildNoun(TOKEN *p)
  162. {
  163.     if(p->child
  164.     && SearchToken(FR_PART_NOUN_ALL, p->child))
  165.         return(TRUE);
  166.  
  167.     return(FALSE);
  168. }
  169.  
  170. BOOL
  171. HasChildNounTime(TOKEN *p)
  172. {
  173.     if(p->child
  174.     && SearchToken(FR_PART_NOUN_GENERAL, JP_PROP_TIME, p->child))
  175.         return(TRUE);
  176.  
  177.     return(FALSE);
  178. }
  179.  
  180. BOOL
  181. HasChildAdjective(TOKEN *p)
  182. {
  183.     if(SearchToken(FR_PART_ADJECTIVE_ALL, p->child))
  184.         return(TRUE);
  185.  
  186.     return(FALSE);
  187. }
  188.  
  189. BOOL
  190. HasNoArticlePossesive(TOKEN *p)
  191. {
  192.     if(p->child
  193.     && (SearchToken(FR_PART_ARTICLE_ALL, p->child)
  194.      || SearchToken(FR_PART_ADJECTIVE_POSSESIVE, p->child)))
  195.         return(FALSE);
  196.  
  197.     return(TRUE);
  198. }
  199.  
  200. BOOL
  201. HasNoArticleWMO(TOKEN *p)
  202. {
  203.     if(p->child == NULL)    return(FALSE);
  204.     TOKEN    *noun = SearchToken(FR_PART_NOUN_ALL, p->child);
  205.     if(noun == NULL)    return(FALSE);
  206.  
  207.     if(noun->child
  208.     && SearchToken(FR_PART_ARTICLE_ALL, noun->child))
  209.         return(FALSE);
  210.     if(!(p->jpEmphasis & JP_EMPHASIS_MO))
  211.         return(FALSE);
  212.  
  213.     return(TRUE);
  214. }
  215.  
  216. BOOL
  217. HasPluralArticlePossesive(TOKEN *p)
  218. {
  219.     if((p->frAttrib & FR_ATTRIB_PLURAL)
  220.     && p->child
  221.     && (SearchToken(FR_PART_ARTICLE_ALL, p->child)
  222.      || SearchToken(FR_PART_ADJECTIVE_POSSESIVE, p->child)))
  223.         return(TRUE);
  224.  
  225.     return(FALSE);
  226. }
  227.  
  228. BOOL
  229. HasNoValue2(TOKEN *p)
  230. {
  231.     if(p->value2 == 0)
  232.         return(TRUE);
  233.     return(FALSE);
  234. }
  235.  
  236. BOOL
  237. IsTokenSingle(TOKEN *p)
  238. {
  239.     if(p->frAttrib & FR_ATTRIB_SINGLE)
  240.         return(TRUE);
  241.     else
  242.         return(FALSE);
  243. }
  244.  
  245. BOOL
  246. IsTokenPlural(TOKEN *p)
  247. {
  248.     if(p->frAttrib & FR_ATTRIB_PLURAL)
  249.         return(TRUE);
  250.     else
  251.         return(FALSE);
  252. }
  253.  
  254. BOOL
  255. IsSentenceSVA(TOKEN *p)
  256. {
  257.     JP_VERB    *jpVerb;
  258.  
  259.     if((p->frPart & FR_PART_VERB)
  260.     && p->which) {
  261.         jpVerb = (JP_VERB *)p->which;
  262.     }
  263.     if(IsObjectMatch(p, FR_PART_SENTENCE_ALL)
  264.     && p->object2
  265.     && (p->object2->frPart & FR_PART_VERB)
  266.     && p->object2->which) {
  267.         jpVerb = (JP_VERB *)p->object2->which;
  268.     }
  269.     if( jpVerb
  270.     && (jpVerb->jpHint & JP_HINT_SVA))
  271.             return(TRUE);
  272.  
  273.     return (FALSE);
  274. }
  275.  
  276. //
  277. // 主語は、人称代名詞でない"ce"か?
  278. //
  279. BOOL
  280. IsSubjectPersonalCe(TOKEN *p)
  281. {
  282.     if((p->frPart & FR_PART_VERB)
  283.     && p->subject
  284.     && IsObjectMatch(p->subject, FR_PART_NOUN_SUBJECT, JP_PROP_NONE, NULL, "ce")
  285.     && p->which) {
  286.         JP_VERB    *jpVerb = (JP_VERB *)p->which;
  287.         // 既に仮主語として使われている
  288.         if(jpVerb->frPart0 != FR_PART_NOUN_IMPERSONAL)
  289.             return(TRUE);
  290.     }
  291.  
  292.     return (FALSE);
  293. }
  294.  
  295. BOOL
  296. IsTokenRootWChild(TOKEN *p)
  297. {
  298.     if(p->child && IsTokenRoot(p))
  299.         return(TRUE);
  300.     else
  301.         return(FALSE);
  302. }
  303.  
  304. BOOL
  305. IsTokenRoot(TOKEN *p)
  306. {
  307.     if(p->jpEmphasis & JP_EMPHASIS_ROOT)
  308.         return(TRUE);
  309.     else
  310.         return(FALSE);
  311. }
  312.  
  313. BOOL
  314. IsSubjectPersonalCe_End(TOKEN *p)
  315. {
  316.     if(IsSubjectPersonalCe(p)
  317.     && p->next == NULL)
  318.         return(TRUE);
  319.     else
  320.         return(FALSE);
  321. }
  322.  
  323. BOOL
  324. IsQuestion(TOKEN *p)
  325. {
  326.     if(currentTree->punctuation == FR_PUNCT_QUESTION)
  327.         return(TRUE);
  328.     else
  329.         return(FALSE);
  330. }
  331.  
  332. BOOL
  333. IsQuestionLast(TOKEN *p)
  334. {
  335.     if(p->next == NULL
  336.     && currentTree->punctuation == FR_PUNCT_QUESTION)
  337.         return(TRUE);
  338.     else
  339.         return(FALSE);
  340. }
  341.  
  342. BOOL
  343. IsExclaminationLast(TOKEN *p)
  344. {
  345.     if(p->next == NULL
  346.     && currentTree->punctuation == FR_PUNCT_EXCLAMINATION) {
  347.         if(p->object2 && IsObjectMatch(p, FR_PART_SENTENCE_ALL))
  348.             p = p->object2;    // SENTENCEのVERB
  349.         // 接続法を用いた3人称命令形をはじく eg) Qu'il parte imm{diatement!
  350.         if((p->frPart & FR_PART_VERB)
  351.         && (p->frAttrib & FR_ATTRIB_LEVEL3)
  352.         && (p->frTense & FR_TENSE_SUBJUNCTIVE))    return(FALSE);
  353.         return(TRUE);
  354.     } else
  355.         return(FALSE);
  356. }
  357.  
  358. BOOL
  359. HasExclaminationAdjective(TOKEN *p)
  360. {
  361.     if(SearchToken(FR_PART_ADJECTIVE_EXCLAMINATION, p->child))
  362.         return(TRUE);
  363.  
  364.     return(FALSE);
  365. }
  366.  
  367.  
  368. BOOL
  369. HasArticleDefinit(TOKEN *p)
  370. {
  371.     if(SearchToken(FR_PART_ARTICLE_DEFINIT, p->child))
  372.         return(TRUE);
  373.  
  374.     return(FALSE);
  375. }
  376.  
  377. // 曜日は固有名詞にして、冠詞なしでも通してしまおう。
  378. // eg) je pars lundi prochain.
  379. BOOL
  380. HasArticleDefinitOrUnique(TOKEN *p)
  381. {
  382.     if(SearchToken(FR_PART_ARTICLE_DEFINIT, p->child)
  383.     || SearchToken(FR_PART_NUMETRIC_NUMBER, p->child)
  384.     || SearchToken(FR_PART_ADJECTIVE_DEMONSTRATIVE, p->child)
  385.     || SearchToken(FR_PART_ADJECTIVE_POSSESIVE, p->child)
  386.     || p->jpProp & JP_PROP_UNIQUE)
  387.         return(TRUE);
  388.     else
  389.         return(FALSE);
  390. }
  391.  
  392.  
  393. BOOL
  394. HasArticleDefinitOrUnique_End(TOKEN *p)
  395. {
  396.     if(HasArticleDefinitOrUnique(p)
  397.     && p->next == NULL)    return(TRUE);
  398.     else                return(FALSE);
  399. }
  400.  
  401. BOOL
  402. HasArticleOrUnique(TOKEN *p)
  403. {
  404.     if(SearchToken(FR_PART_ARTICLE_ALL, p->child)
  405.     || SearchToken(FR_PART_ADJECTIVE_DEMONSTRATIVE, p->child)
  406.     || SearchToken(FR_PART_ADJECTIVE_POSSESIVE, p->child)
  407.     || p->jpProp & JP_PROP_UNIQUE)
  408.         return(TRUE);
  409.     else
  410.         return(FALSE);
  411. }
  412.  
  413.  
  414. BOOL
  415. HasAdjective(TOKEN *p)
  416. {
  417.     if(SearchToken(FR_PART_ADJECTIVE_ALL, p->child))
  418.         return(TRUE);
  419.  
  420.     return(FALSE);
  421. }
  422.  
  423. BOOL
  424. HasVerbVerbObject(TOKEN *p)
  425. {
  426.     if(p->frPart & FR_PART_VERB) {
  427.         if(p->object1) {
  428.             if((p->object1->frPart & FR_PART_VERB)
  429.             || SearchToken(FR_PART_RELATIVE_ALL, p->object1->child))
  430.                 return(TRUE);
  431.         }
  432.         if(p->object2) {
  433.             if((p->object2->frPart & FR_PART_VERB)
  434.             || SearchToken(FR_PART_RELATIVE_ALL, p->object2->child))
  435.                 return(TRUE);
  436.         }
  437.     }
  438.     return(FALSE);
  439. }
  440.  
  441. BOOL
  442. HasObject1(TOKEN *p)
  443. {
  444.     if(p->object1)
  445.         return(TRUE);
  446.  
  447.     return(FALSE);
  448. }
  449.  
  450. BOOL
  451. HasNoObjects(TOKEN *p)
  452. {
  453.     if(p->object1 == NULL
  454.     && p->object2 == NULL)
  455.         return(TRUE);
  456.  
  457.     return(FALSE);
  458. }
  459.  
  460. BOOL
  461. HasNumber(TOKEN *p)
  462. {
  463.     if(SearchToken(FR_PART_NUMETRIC_NUMBER, p->child))
  464.         return(TRUE);
  465.  
  466.     return(FALSE);
  467. }
  468.  
  469. BOOL
  470. HasOnlyObject2(TOKEN *p)
  471. {
  472.     if(p->object1 == NULL
  473.     && p->object2 != NULL)
  474.         return(TRUE);
  475.  
  476.     return(FALSE);
  477. }
  478.  
  479. BOOL
  480. HasPastParticile(TOKEN *p)
  481. {
  482.     if(SearchToken(FR_PART_VERB_P_PAST, p->child))
  483.         return(TRUE);
  484.     else
  485.         return(FALSE);
  486. }
  487.  
  488. BOOL
  489. HasPrepositionDe(TOKEN *p)
  490. {
  491.     if(SearchToken(FR_PART_PREPOSIT_DE, p->child))
  492.         return(TRUE);
  493.  
  494.     return(FALSE);
  495. }
  496.  
  497. BOOL
  498. HasPrepositionDeInf(TOKEN *p)
  499. {
  500.     if(SearchToken(FR_PART_PREPOSIT_DE_INF, p->child))
  501.         return(TRUE);
  502.  
  503.     return(FALSE);
  504. }
  505.  
  506. BOOL
  507. HasRelative(TOKEN *p)
  508. {
  509.     if(p->frPart & FR_PART_RELATIVE)    return(TRUE);
  510.     if(p->subject && HasRelative(p->subject))    return(TRUE);
  511.     if(p->object1 && HasRelative(p->object1))    return(TRUE);
  512.     if(p->object2 && HasRelative(p->object2))    return(TRUE);
  513.  
  514.     for(TOKEN *q = p->child; q; q = q->next) {
  515.         if(HasRelative(q))    return(TRUE);
  516.     }
  517.  
  518.     return(FALSE);
  519. }
  520.  
  521. BOOL
  522. HasQue(TOKEN *p)
  523. {
  524.     if(p
  525.     && SearchToken(FR_PART_RELATIVE_OBJECT, p->child))
  526.         return(TRUE);
  527.     return(FALSE);
  528. }
  529.  
  530. BOOL
  531. HasQuel(TOKEN *p)
  532. {
  533.     if(p
  534.     && SearchToken("quel", p->child))
  535.         return(TRUE);
  536.     return(FALSE);
  537. }
  538.  
  539. BOOL
  540. HasQui(TOKEN *p)
  541. {
  542.     if(p
  543.     && SearchToken(FR_PART_RELATIVE_SUBJECT, p->child))
  544.         return(TRUE);
  545.     return(FALSE);
  546. }
  547.  
  548. // JP_KIND == JP_KIND_NO ?
  549. BOOL
  550. IsJpKind_NO(TOKEN *p)
  551. {
  552.     if(p->which
  553.     && GetJpKind(p) == JP_KIND_NONE)
  554.         return(TRUE);
  555.     
  556.     return(FALSE);
  557. }
  558.  
  559. // JP_KIND == JP_KIND_KAMIICHI ?
  560. BOOL
  561. IsJpKind_KAMIICHI(TOKEN *p)
  562. {
  563.     if(p->which
  564.     && GetJpKind(p) == JP_KIND_IRU)
  565.         return(TRUE);
  566.  
  567.     return(FALSE);
  568. }
  569.  
  570.  
  571. BOOL
  572. IsTenseFuture(TOKEN *p)
  573. {
  574.     if(p->frTense & FR_TENSE_FUTURE_SIMPLE)
  575.         return(TRUE);
  576.  
  577.     return(FALSE);
  578. }
  579.  
  580. BOOL
  581. IsTenseOrigin(TOKEN *p)
  582. {
  583.     if(p->frTense & FR_TENSE_ORIGIN)    return(TRUE);
  584.     else                                return(FALSE);
  585. }
  586.  
  587.  
  588. BOOL
  589. IsNotParticiple(TOKEN *p)
  590. {
  591.     if(!(p->frPart & FR_PART_VERB)
  592.     || (p->frTense & FR_TENSE_P_PRESENT)
  593.     || (p->frTense & FR_TENSE_P_PAST))
  594.         return(FALSE);
  595.  
  596.     return(TRUE);
  597. }
  598.  
  599. BOOL
  600. IsNotThing(TOKEN *p)
  601. {
  602.     if(!(p->jpProp & JP_PROP_THING))
  603.         return(TRUE);
  604.  
  605.     return(FALSE);
  606. }
  607.  
  608. BOOL
  609. IsSubjunctive(TOKEN *p)
  610. {
  611.     if(p &&IsObjectMatch(p, FR_PART_SENTENCE_ALL))
  612.         p = p->object2;
  613.     if( p
  614.     && (p->frPart & FR_PART_VERB)
  615.     && (p->frTense & FR_TENSE_SUBJUNCTIVE))
  616.         return(TRUE);
  617.     return(FALSE);
  618. }
  619.  
  620. BOOL
  621. IsNotTokenCombine(TOKEN *p)
  622. {
  623.     if(p->frPart & FR_PART_COMBINE)
  624.         return(FALSE);
  625.     else
  626.         return(TRUE);
  627. }
  628.  
  629.  
  630. BOOL
  631. IsAttribPlus(TOKEN *p)
  632. {
  633.     if(p->frAttrib & FR_ATTRIB_PLUS)
  634.         return(TRUE);
  635.     else
  636.         return(FALSE);
  637. }
  638.  
  639. BOOL
  640. IsAttribMoins(TOKEN *p)
  641. {
  642.     if(p->frAttrib & FR_ATTRIB_MOINS)
  643.         return(TRUE);
  644.     return(FALSE);
  645. }
  646.  
  647. BOOL
  648. IsAttribIl(TOKEN *p)
  649. {
  650.     if((p->frAttrib & FR_ATTRIB_SINGLE)
  651.     && (p->frAttrib & FR_ATTRIB_MALE)
  652.     && (p->frAttrib & FR_ATTRIB_LEVEL3))
  653.         return(TRUE);
  654.     else
  655.         return(FALSE);
  656. }
  657.  
  658. BOOL
  659. IsCompare(TOKEN *p)
  660. {
  661.     if(p->frAttrib & FR_ATTRIB_COMPARE)
  662.         return(TRUE);
  663.  
  664.     return(FALSE);
  665. }
  666.  
  667. // 曜日の名前か?
  668. char    *daynameTable[] = {
  669.     "lundi",
  670.     "mardi",
  671.     "mercredi",
  672.     "jeudi",
  673.     "vendredi",
  674.     "samedi",
  675.     "dimanche",
  676.     ""    // End Code
  677. };
  678.  
  679. BOOL
  680. IsDayName(TOKEN *p)
  681. {
  682.     for(int i = 0; daynameTable[i][0]; i++) {
  683.         if(IsTokenFrench(p, daynameTable[i]))
  684.             return(TRUE);
  685.     }
  686.  
  687.     return(FALSE);
  688. }
  689.  
  690. BOOL
  691. IsNotPassive(TOKEN *p)
  692. {
  693.     if(IsObjectMatch(p, FR_PART_SENTENCE_ALL)
  694.     && p->object2
  695.     && (p->object2->frPart & FR_PART_VERB))
  696.         p = p->object2;
  697.  
  698.     if(!(p->frTense & FR_TENSE_PASSIVE))
  699.         return(TRUE);
  700.  
  701.     return(FALSE);
  702. }
  703.  
  704. BOOL
  705. IsNullNoun(TOKEN *p)
  706. {
  707.     if(p->what == (void *)&nullPronoun)
  708.         return(TRUE);
  709.  
  710.     return(FALSE);
  711. }
  712.  
  713. BOOL
  714. IsMoved(TOKEN *p)
  715. {
  716.     if(p->moved)
  717.         return(TRUE);
  718.  
  719.     return(FALSE);
  720. }
  721.  
  722. BOOL
  723. IsVerbOrigin(TOKEN *p)
  724. {
  725.     if((p->frPart & FR_PART_VERB)
  726.     && (p->frTense & FR_TENSE_ORIGIN))
  727.         return(TRUE);
  728.  
  729.     return(FALSE);
  730. }
  731.  
  732. BOOL
  733. IsWhichFixed(TOKEN *p)
  734. {
  735.     if(p->which)    return(TRUE);
  736.  
  737.     return(FALSE);
  738. }
  739.  
  740. BOOL
  741. CanNounParent(TOKEN *p)
  742. {
  743.     if(p->frPartParent & FR_PART_NOUN)
  744.         return(TRUE);
  745.  
  746.     return(FALSE);
  747. }
  748.  
  749. BOOL
  750. CanVerbParent(TOKEN *p)
  751. {
  752.     if(p->frPartParent & FR_PART_VERB)
  753.         return(TRUE);
  754.  
  755.     return(FALSE);
  756. }
  757.  
  758. void
  759. ReplaceObject1(TOKEN *verb)
  760. {
  761.     TOKEN    *object = verb->object1;
  762.  
  763.     if(object == NULL)    return;
  764.  
  765.     if((object->frPart & FR_PART_PREPOSIT)
  766.     &&  object->object1) {
  767.         object = object->object1;
  768.     }
  769.  
  770.     object->prtControl = PRT_CONTROL_REPLACED;
  771.     DisablePrtControl(object->child, FR_PART_ARTICLE_ALL);
  772. }
  773.  
  774. void
  775. ReplaceObject1(TOKEN *parent, TOKEN *p)
  776. {
  777.     ReplaceObject1(p);
  778. }
  779.  
  780.  
  781. void
  782. ReplaceObject1De(TOKEN *verb)
  783. {
  784.     if(verb
  785.     && verb->object1) {
  786.         verb->object1->prtControl = PRT_CONTROL_REPLACED;
  787.         TOKEN *de = SearchToken(FR_PART_PREPOSIT_DE, verb->object1->child);
  788.         if(de) de->prtControl = PRT_CONTROL_REPLACED;
  789.     }
  790. }
  791.  
  792. void
  793. EmphasisChildSubject_GA(TOKEN *parent, TOKEN *child)
  794. {
  795.     if((child->frPart & FR_PART_PREPOSIT)
  796.     && child->object1) {
  797.         EmphasisChildSubject_GA(parent, child->object1);
  798.     }
  799.     else if((child->frPart & FR_PART_VERB)
  800.     && child->subject) {
  801.         child->subject->jpEmphasis |= JP_EMPHASIS_GA;
  802.     }
  803.     else {
  804.         child->jpEmphasis |= JP_EMPHASIS_GA;
  805.     }
  806. }
  807.  
  808. void
  809. DemphasisParentSubject_GA(TOKEN *parent, TOKEN *child)
  810. {
  811.     if(parent->frPart & FR_PART_PREPOSIT
  812.     && parent->object1) {
  813.         DemphasisParentSubject_GA(parent->object1, child);
  814.     } else if((parent->frPart & FR_PART_VERB)
  815.     && parent->subject) {
  816.         parent->subject->jpEmphasis -= JP_EMPHASIS_GA;
  817.     }
  818.     else {
  819.         parent->jpEmphasis -= JP_EMPHASIS_GA;
  820.     }
  821. }
  822.  
  823. void
  824. DemphasisChildSubject_GA(TOKEN *parent, TOKEN *child)
  825. {
  826.     if((child->frPart & FR_PART_PREPOSIT)
  827.     && child->object1) {
  828.         DemphasisChildSubject_GA(parent, child->object1);
  829.     } else if((child->frPart & FR_PART_VERB)
  830.     && child->subject) {
  831.         child->subject->jpEmphasis -= JP_EMPHASIS_GA;
  832.     }
  833.     else {
  834.         child->jpEmphasis -= JP_EMPHASIS_GA;
  835.     }
  836. }
  837.  
  838. void
  839. DisableChildPrtControl(TOKEN *parent, TOKEN *child)
  840. {
  841.     if(child)
  842.         child->prtControl = PRT_CONTROL_DISABLE;
  843. }